#ifndef CORE_COLOR_H
#define CORE_COLOR_H

#include "Common/Common.h"

namespace core
{

struct Color
{
	float R, G, B, A;

	Color( ) : R( 0.0f ), G( 0.0f ), B( 0.0f ), A( 1.0f )
	{
	}

	Color( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 1.0f )
	{
	}

	Color( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a )
	{
	}

	Color operator +=(const Color & v );
	Color operator -=(const Color & v );
	Color operator *=(const Color & v );
	Color operator *=(float a);
	Color operator /=(float a);

	inline float* Array( ) const
	{
		return (float*) &R;
	}

	static const Color BLACK;
	static const Color GREY;
	static const Color WHITE;
	static const Color RED;
	static const Color GREEN;
	static const Color BLUE;
};

inline Color operator+(const Color& a, const Color& b )
{
	return Color( a.R + b.R, a.G + b.G, a.B + b.B, a.A + b.A );
}

inline Color operator-(const Color& a, const Color& b )
{
	return Color( a.R - b.R, a.G - b.G, a.B - b.B, a.A - b.A );
}

inline Color operator*(const Color& a, const Color& b )
{
	return Color( a.R * b.R, a.G * b.G, a.B * b.B, a.A * b.A );
}

inline Color operator*(const Color& v, float a)
{
	return Color( v.R * a, v.G * a, v.B * a, v.A * a );
}

inline Color operator/(const Color& v, float a)
{
	return Color( v.R / a, v.G / a, v.B / a, v.A / a );
}

inline bool operator ==(const Color& a, const Color& b )
{
	return FloatEq( a.R, b.R ) &&
		   FloatEq( a.G, b.G ) &&
		   FloatEq( a.B, b.B ) &&
		   FloatEq( a.A, b.A );
}

inline bool operator !=(const Color& a, const Color& b )
{
	return !FloatEq( a.R, b.R ) ||
		   !FloatEq( a.G, b.G ) ||
		   !FloatEq( a.B, b.B ) ||
		   !FloatEq( a.A, b.A );
}
}
#endif
